﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Reflection;
using Excel = Microsoft.Office.Interop.Excel; 

namespace Tema2_Adabd
{
    public partial class MainForm : Form
    {
        private void clkAdaugaProdus(object sender, EventArgs e)
        {
            bool areDreptul = false;
            foreach (var p in utilizator.permisiuni)
                if (p == "adaugare produs" | p == "editare produs")
                {
                    areDreptul = true;
                    break;
                }
            if (areDreptul == false)
            {
                MessageBox.Show("Nu aveti aceasta permisiune.", "", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }
            Adaugare_Produs ap = new Adaugare_Produs(utilizator);
            ap.Show();
        }

        private void clkEditeazaProdus(object sender, EventArgs e)
        {
            bool areDreptul = false;
            foreach (var p in utilizator.permisiuni)
                if (p == "editare produs")
                {
                    areDreptul = true;
                    break;
                }
            if (areDreptul == false)
            {
                MessageBox.Show("Nu aveti aceasta permisiune.", "", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }
            //verifica existenta produsului
            if (txtEditare.Text == "")
            {
                MessageBox.Show("Nu ati completat campul aferent produsului de editat.");
                return;
            }
            try
            {
                if (utilizator.produsExistentInBazaDeDate(txtEditare.Text) == false)
                {
                    //Ofera utilizatorului o lista cu cele mai similare 10 nume de produse.
                    MessageBox.Show("Nu exista un produs cu un astfel de nume in baza de date.");
                    return;
                }

                Adaugare_Produs ap = new Adaugare_Produs(utilizator, txtEditare.Text);
                ap.Show();
            }
            catch (Exception exp)
            {
                MessageBox.Show(exp.ToString(), "Eroare");
            }
            finally
            {
                reseteazaControaleDupaEditare();
            }
        }

        private void clkStergeProdus(object sender, EventArgs e)
        {
            bool areDreptul = false;
            foreach (var p in utilizator.permisiuni)
                if (p == "stergere produs")
                {
                    areDreptul = true;
                    break;
                }
            if (areDreptul == false)
            {
                MessageBox.Show("Nu aveti aceasta permisiune.", "", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }
            if (txtStergere.Text == "")
            {
                MessageBox.Show("Nu ati completat campul cu numele produsului pe care doriti sa-l stergeti. Va rugam corectati greseala.");
                return;
            }
            if (checkBoxTemporar.Checked == true && checkBoxStergereDefinitiva.Checked == true)
            {
                MessageBox.Show("Ati completat ambele checkbox-uri. Va rugam reveniti.");
                return;
            }
            if (checkBoxTemporar.Checked == false && checkBoxStergereDefinitiva.Checked == false)
            {
                MessageBox.Show("Nu ati completat niciun checkbox. Va rugam reveniti.");
                return;
            }

            try
            {
                if (checkBoxTemporar.Checked == true)
                {
                    utilizator.stergeTemporarProdusul(txtStergere.Text);
                    MessageBox.Show("Stergerea temporara s-a realizat cu succes.");
                }
                else
                {
                    DialogResult dr = MessageBox.Show("Sunteti pe cale sa stergeti defintiv produsul. Continuati?","",MessageBoxButtons.YesNo,MessageBoxIcon.Warning);
                    if (dr == DialogResult.Yes)
                    {
                        utilizator.stergeDefinitivProdusul(txtStergere.Text);
                        MessageBox.Show("Stergerea definitva s-a realizat cu succes.");
                    }
                }

            }
            catch (Exception exp)
            {
                MessageBox.Show(exp.ToString(), "Eroare");
            }
            finally
            {
                restaureazaControaleDupaStergere();
            }
        }

        private void clkExecutaListare(object sender, EventArgs e)
        {
            try
            {
                dgProduse.DataSource = utilizator.toateProdusele();

                MessageBox.Show("Listare terminata.");
            }
            catch (Exception exp)
            {
                MessageBox.Show(exp.ToString(), "Eroare clkExecutaListare");
            }
            finally
            {
                reseteazaControaleDupaListare();
                reseteazaControaleDupaOperatie();
            }
        }

        private void clkExecutaSortare(object sender, EventArgs e)
        {
            try
            {
                string criteriuSortare = cbSorteazaDupa.GetItemText(this.cbSorteazaDupa.SelectedItem);

                if (criteriuSortare == "nume produs ASC")
                {
                    dgProduse.DataSource=utilizator.produseSortate("nume_produs","ASC");
                }
                if (criteriuSortare == "nume produs DESC")
                {
                    dgProduse.DataSource = utilizator.produseSortate("nume_produs", "DESC");
                }
                if (criteriuSortare == "pret ASCENDENT")
                {
                    dgProduse.DataSource = utilizator.produseSortate("pret", "ASC");
                }
                if (criteriuSortare == "pret DESCENDENT")
                {
                    dgProduse.DataSource = utilizator.produseSortate("pret", "DESC");
                }
                if (criteriuSortare == "stoc ASCENDENT")
                {
                    dgProduse.DataSource = utilizator.produseSortate("stoc", "ASC");
                }
                if (criteriuSortare == "stoc DESCENDENT")
                {
                    dgProduse.DataSource = utilizator.produseSortate("stoc", "DESC");
                }
                MessageBox.Show("Sortare incheiata cu succes.");
            }
            catch (Exception exp)
            {
                MessageBox.Show(exp.ToString(), "Eroare clkExecutaSortare");
            }
            finally
            {
                reseteazaControaleDupaSortare();
                reseteazaControaleDupaOperatie();
            }
        }

        private void clkExecutaFiltrare(object sender, EventArgs e)
        {
            try
            {
                string cf =this.cbFiltru.GetItemText(this.cbFiltru.SelectedItem);
                if (cf == "pret")
                {
                    dgProduse.DataSource = utilizator.filtrareDupaPret(decimal.Parse(txtLimitaInferioara.Text), decimal.Parse(txtLimitaSuperioara.Text));
                }
                else
                    dgProduse.DataSource = utilizator.produseFiltrate(cf, txtValFiltru.Text);

                MessageBox.Show("Filtrare incheiata cu succes.");
            }
            catch (Exception exp)
            {
                MessageBox.Show(exp.ToString(), "Eroare la clkExecutaFiltrare");
            }
            finally
            {
                if (lbLimitaInferioara.Enabled == true)
                {
                    lbLimitaInferioara.Visible = false;
                    lbLimitaInferioara.Enabled = false;
                    lbLimitaSuperioara.Visible = false;
                    lbLimitaSuperioara.Enabled = false;
                    txtLimitaSuperioara.Text = "";
                    txtLimitaInferioara.Text = "";
                    txtLimitaInferioara.Visible = false;
                    txtLimitaInferioara.Enabled = false;
                    txtLimitaSuperioara.Visible = false;
                    txtLimitaSuperioara.Enabled = false;
                }
                txtValFiltru.Text = "";

                reseteazaControaleDupaFiltrare();
                reseteazaControaleDupaOperatie();
            }
        }

        private void clkExecutaCautare(object sender, EventArgs e)
        {
            try
            {
                dgProduse.DataSource = utilizator.cautaProdus(txtProdusDeCautat.Text);
                txtProdusDeCautat.Text = "";
            }
            catch (Exception exp)
            {
                MessageBox.Show(exp.ToString(), "Eroare la clkExecutaCautare");
            }
            finally
            {
                reseteazaControaleDupaCautare();
                reseteazaControaleDupaOperatie();
            }
        }

        private void restaureazaControaleDupaStergere()
        {
            txtStergere.Text = "";
            checkBoxTemporar.Checked = false;
            checkBoxStergereDefinitiva.Checked = false;
        }

        private void reseteazaControaleDupaEditare()
        {
            txtEditare.Text = "";
        }

        private void RemoveClickEvent(Button b)
        {
            FieldInfo f1 = typeof(Control).GetField("EventClick",
                BindingFlags.Static | BindingFlags.NonPublic);
            object obj = f1.GetValue(b);
            PropertyInfo pi = b.GetType().GetProperty("Events",
                BindingFlags.NonPublic | BindingFlags.Instance);
            EventHandlerList list = (EventHandlerList)pi.GetValue(b, null);
            list.RemoveHandler(obj, list[obj]);
        }

    }
}